Emacs should work with glibc 2.24 on ppc64
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 15 Jul 2016 11:07:09 +0000 (13:07 +0200)
committerRob Browning <rlb@defaultvalue.org>
Mon, 5 Sep 2016 19:42:15 +0000 (14:42 -0500)
This patch, backported from upstream by Aurelien Jarno
<aurel32@debian.org>, has been added:

  Port to glibc 2.24 (pre-release) + ppc64

  Inspired by a suggestion by Florian Weimer in:
  https://sourceware.org/ml/libc-alpha/2016-07/msg00425.html
  * configure.ac (HAVE_PERSONALITY_ADDR_NO_RANDOMIZE):
  Rename from HAVE_PERSONALITY_LINUX32, and check for
  ADDR_NO_RANDOMIZE (the crucial thing) instead of for LINUX32.
  All uses changed.
  * src/emacs.c (main) [HAVE_PERSONALITY_ADDR_NO_RANDOMIZE]:
  Use ADDR_NO_RANDOMIZE from personality.h rather than inventing the
  flag ourselves.  Just set that flag, rather than also setting the
  persona.  When doing it, avoid functions like putenv that may
  allocate memory.

Origin: backport, commit: e95b023163e96538b15f030b7176b7ec59cf86f5
Bug-Debian: http://bugs.debian.org/833727
Added-by: Rob Browning <rlb@defaultvalue.org>
admin/CPP-DEFINES
configure.ac
src/emacs.c

index e475b42250035f535514e0e078fbab1fc42db1d8..ef355135d8ac93cb9baf0ce66b3e34545b3eddb3 100644 (file)
@@ -244,7 +244,7 @@ HAVE_NET_IF_DL_H
 HAVE_NET_IF_H
 HAVE_NLIST_H
 HAVE_OTF_GET_VARIATION_GLYPHS
-HAVE_PERSONALITY_LINUX32
+HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
 HAVE_PNG
 HAVE_PNG_H
 HAVE_POSIX_MEMALIGN
index bdc76bca3db135db9c748bc5fc286663ef9d24c5..18387d84ec538befea8d1c198450cc4695321804 100644 (file)
@@ -1478,15 +1478,17 @@ AC_CHECK_HEADERS_ONCE(
   sys/resource.h
   sys/utsname.h pwd.h utmp.h util.h)
 
-AC_MSG_CHECKING(if personality LINUX32 can be set)
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/personality.h>]], [[personality (PER_LINUX32)]])],
-               emacs_cv_personality_linux32=yes,
-              emacs_cv_personality_linux32=no)
-AC_MSG_RESULT($emacs_cv_personality_linux32)
-
-if test $emacs_cv_personality_linux32 = yes; then
-  AC_DEFINE(HAVE_PERSONALITY_LINUX32, 1,
-            [Define to 1 if personality LINUX32 can be set.])
+AC_CACHE_CHECK([for ADDR_NO_RANDOMIZE],
+  [emacs_cv_personality_addr_no_randomize],
+  [AC_COMPILE_IFELSE(
+     [AC_LANG_PROGRAM([[#include <sys/personality.h>]],
+                     [[personality (personality (0xffffffff)
+                                    | ADDR_NO_RANDOMIZE)]])],
+     [emacs_cv_personality_addr_no_randomize=yes],
+     [emacs_cv_personality_addr_no_randomize=no])])
+if test $emacs_cv_personality_addr_no_randomize = yes; then
+  AC_DEFINE([HAVE_PERSONALITY_ADDR_NO_RANDOMIZE], [1],
+            [Define to 1 if personality flag ADDR_NO_RANDOMIZE exists.])
 fi
 
 dnl On Solaris 8 there's a compilation warning for term.h because
index b5d3ab46a00796baeb20d7a79d0be499d3bc52c0..eda439ac6b1effe13072750ff2aa42fdf6e4467b 100644 (file)
@@ -99,7 +99,7 @@ extern void moncontrol (int mode);
 #include <sys/resource.h>
 #endif
 
-#ifdef HAVE_PERSONALITY_LINUX32
+#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
 #include <sys/personality.h>
 #endif
 
@@ -833,24 +833,22 @@ main (int argc, char **argv)
   dumping = !initialized && (strcmp (argv[argc - 1], "dump") == 0
                             || strcmp (argv[argc - 1], "bootstrap") == 0);
 
-#ifdef HAVE_PERSONALITY_LINUX32
-  if (dumping && ! getenv ("EMACS_HEAP_EXEC"))
+#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
+  if (dumping)
     {
-      /* Set this so we only do this once.  */
-      xputenv ("EMACS_HEAP_EXEC=true");
-
-      /* A flag to turn off address randomization which is introduced
-         in linux kernel shipped with fedora core 4 */
-#define ADD_NO_RANDOMIZE 0x0040000
-      personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
-#undef  ADD_NO_RANDOMIZE
-
-      execvp (argv[0], argv);
+      int pers = personality (0xffffffff);
+      if (! (pers & ADDR_NO_RANDOMIZE)
+         && 0 <= personality (pers | ADDR_NO_RANDOMIZE))
+       {
+         /* Address randomization was enabled, but is now disabled.
+            Re-execute Emacs to get a clean slate.  */
+         execvp (argv[0], argv);
 
-      /* If the exec fails, try to dump anyway.  */
-      emacs_perror (argv[0]);
+         /* If the exec fails, warn and then try without a clean slate.  */
+         perror (argv[0]);
+       }
     }
-#endif /* HAVE_PERSONALITY_LINUX32 */
+#endif
 
 #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
   /* Extend the stack space available.